#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 1000010, P = 1e9 + 7;
int n, k;
char s[N];
int w[N], one[N];
LL h[N], pre[N];
bool st[N];
LL hashy(int l, int r)
{
return (pre[r] - pre[l-1] * h[r-l+1]%P+P)%P;
}
void solve()
{
scanf("%d%d%s", &n, &k, s + 1);
for(int i = 0; i <= n + 1; i++) st[i] = 0;
for(int i = 1; i <= n; i++)
{
w[i] = s[i] == '0';
pre[i] = (pre[i-1]*2+w[i])%P;
one[i] = one[i-1]+w[i];
}
for(int i = 1; i <= n - k + 1; i++)
{
int x = hashy(max(i, i + k - 20), i + k - 1);
if(k > 20 && one[i+k-20]-one[i-1] > 0 || x > n) continue;
st[x] = 1;
}
int v = -1, d = min(k, 21);
for(int i = 0; i < 1<<d; i++)
if(!st[i])
{
v = i;
break;
}
if(v == -1) puts("NO");
else
{
string ans = "";
printf ("YES\n");
for(int i = 0;i <= k; i ++) ans += '0';
for(int i = 20;i >= 0;i --){
if((v >> i) & 1) ans += '1';
else ans += '0';
}
cout<<ans.substr(ans.size() - k,ans.size())<<endl;
}
}
int main()
{
h[0] = 1;
for(int i = 1; i <= 30; i++) h[i] = h[i-1]*2%P;
int T;
scanf("%d", &T);
while(T--) solve();
return 0;
}
1452A - Robot Program | 344A - Magnets |
96A - Football | 702B - Powers of Two |
1036A - Function Height | 443A - Anton and Letters |
1478B - Nezzar and Lucky Number | 228A - Is your horseshoe on the other hoof |
122A - Lucky Division | 1611C - Polycarp Recovers the Permutation |
432A - Choosing Teams | 758A - Holiday Of Equality |
1650C - Weight of the System of Nested Segments | 1097A - Gennady and a Card Game |
248A - Cupboards | 1641A - Great Sequence |
1537A - Arithmetic Array | 1370A - Maximum GCD |
149A - Business trip | 34A - Reconnaissance 2 |
59A - Word | 462B - Appleman and Card Game |
1560C - Infinity Table | 1605C - Dominant Character |
1399A - Remove Smallest | 208A - Dubstep |
1581A - CQXYM Count Permutations | 337A - Puzzles |
495A - Digital Counter | 796A - Buying A House |